// entry/src/main/ets/services/LiveViewService.ts

import { liveViewManager } from '@kit.LiveViewKit';
import { Want, wantAgent } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { LiveViewOptions } from '../models/LiveViewModel';
import { notificationManager } from '@kit.NotificationKit';

const DOMAIN = 0x0001;
const TAG = 'LiveViewService';
const LIVEVIEW_ID_KEY = 'currentLiveViewId_persistent';

/**
 * 实况窗服务类
 * 负责创建、更新和结束健康计划实况窗
 * ⭐ 新增：持��化存储实况窗 ID，防止页面刷新或应用重启后 ID 丢失
 */
export class LiveViewService {
  private readonly BUNDLE_NAME = 'com.example.harmonyhealth'; // ✅ 修复：使用正确的 bundleName（来自 app.json5）

  /**
   * 初始化持久化存储
   * 应在应用启动时调用（EntryAbility.onCreate）
   */
  static initPersistentStorage(): void {
    PersistentStorage.persistProp(LIVEVIEW_ID_KEY, 0);
    hilog.info(DOMAIN, TAG, '实况窗持久化存储已初始化');
  }

  /**
   * 获取当前实况窗ID（从持久化存储）
   */
  getCurrentLiveViewId(): number {
    return AppStorage.get<number>(LIVEVIEW_ID_KEY) ?? 0;
  }

  /**
   * 设置当前实况窗ID（保存到持久化存储）
   */
  private setCurrentLiveViewId(id: number): void {
    AppStorage.setOrCreate(LIVEVIEW_ID_KEY, id);
    hilog.info(DOMAIN, TAG, `实况窗 ID 已持久化: ${id}`);
  }

  /**
   * 检查实况窗开关是否打开
   */
  async isLiveViewEnabled(): Promise<boolean> {
    try {
      const enabled = await liveViewManager.isLiveViewEnabled();
      hilog.info(DOMAIN, TAG, `实况窗开关状态: ${enabled}`);
      return enabled;
    } catch (err) {
      const error = err as BusinessError;
      hilog.error(DOMAIN, TAG, `检查实况窗开关失败: ${error.code} ${error.message}`);
      return false;
    }
  }

  /**
   * 创建健康计划实况窗
   * @param options 实况窗选项（标题、进度等）
   * @returns 实况窗ID，失败返回0
   *
   * ⭐ 修复：创建前先停止旧实况窗，防止多个卡片堆叠
   */
  async createHealthPlanLiveView(options: LiveViewOptions): Promise<number> {
    try {
      // ⭐ 修复：创建新实况窗前，先停止旧的实况窗
      const oldLiveViewId = this.getCurrentLiveViewId();
      if (oldLiveViewId > 0) {
        hilog.warn(DOMAIN, TAG, `检测到旧实况窗 ID: ${oldLiveViewId}，先停止旧实况窗...`);
        await this.stopHealthPlanLiveView(oldLiveViewId);
      }

      // 构建实况窗数据
      hilog.info(DOMAIN, TAG, '步骤1: 构建实况窗数据...');
      const liveViewData = await this.buildLiveViewData(options);
      hilog.info(DOMAIN, TAG, `实况窗数据: ID=${liveViewData.id}, event=${liveViewData.event}`);

      // 创建实况窗
      hilog.info(DOMAIN, TAG, '步骤2: 调用 startLiveView...');
      await liveViewManager.startLiveView(liveViewData);

      // ⭐ 修复：保存到持久化存储
      this.setCurrentLiveViewId(liveViewData.id);
      hilog.info(DOMAIN, TAG, `✅ 实况窗创建成功，ID: ${liveViewData.id}`);
      return liveViewData.id;
    } catch (err) {
      const error = err as BusinessError;
      hilog.error(DOMAIN, TAG, `❌ 创建实况窗失败: code=${error.code}, message=${error.message}`);
      hilog.error(DOMAIN, TAG, `错误详情: ${JSON.stringify(error)}`);
      return 0;
    }
  }

  /**
   * 更新健康计划实况窗进度
   * @param liveViewId 实况窗ID
   * @param options 更新选项（标题、进度等）
   */
  async updateHealthPlanProgress(liveViewId: number, options: LiveViewOptions): Promise<boolean> {
    try {
      if (liveViewId === 0) {
        hilog.warn(DOMAIN, TAG, '实况窗ID无效');
        return false;
      }

      // 构建更新数据
      const liveViewData = await this.buildLiveViewData(options);
      liveViewData.id = liveViewId;

      // 更新实况窗
      await liveViewManager.updateLiveView(liveViewData);
      hilog.info(DOMAIN, TAG, `实况窗更新成功，ID: ${liveViewId}, 进度: ${options.progress}%`);

      return true;
    } catch (err) {
      const error = err as BusinessError;
      hilog.error(DOMAIN, TAG, `更新实况窗失败: ${error.code} ${error.message}`);
      return false;
    }
  }

  /**
   * 结束健康计划实况窗
   * @param liveViewId 实况窗ID
   *
   * ⭐ 修复：同时清除通知中心的历史记录,防止堆叠显示
   */
  async stopHealthPlanLiveView(liveViewId: number): Promise<boolean> {
    try {
      if (liveViewId === 0) {
        hilog.warn(DOMAIN, TAG, '实况窗ID无效');
        return false;
      }

      hilog.info(DOMAIN, TAG, `准备结束实况窗，ID: ${liveViewId}`);

      // 步骤1: 构建结束实况窗的数据 - 关键：设置 capsule.status = -1 表示结束
      const liveView: liveViewManager.LiveView = {
        id: liveViewId,
        event: 'WORKOUT',
        liveViewData: {
          primary: {
            title: '',
            content: [],
            clickAction: await this.buildWantAgent(),
            layoutData: {
              layoutType: liveViewManager.LayoutType.LAYOUT_TYPE_PROGRESS,
              progress: 0,
              color: '#FF0A59F7',
              backgroundColor: '#FFC9D7E4',
              lineType: liveViewManager.LineType.LINE_TYPE_NORMAL_SOLID_LINE,
              nodeIcons: ['node_icon_1.svg', 'node_icon_2.svg', 'node_icon_3.svg']
            }
          },
          // ⭐ 关键：设置胶囊状态为 -1 表示结束
          capsule: {
            type: liveViewManager.CapsuleType.CAPSULE_TYPE_TEXT,
            status: -1,  // ⭐ -1 表示结束实况窗
            icon: 'liveview_health_icon.svg',
            backgroundColor: '#FF0A59F7',
            title: '计划完成度',
            content: '0%'
          }
        }
      };

      // 步骤2: 停止实况窗
      await liveViewManager.stopLiveView(liveView);
      hilog.info(DOMAIN, TAG, '✅ 实况窗已停止');

      // 步骤3: ⭐ 清除通知中心的历史记录（关键修复）
      try {
        await notificationManager.cancel(liveViewId);
        hilog.info(DOMAIN, TAG, `✅ 通知中心历史记录已清除，ID: ${liveViewId}`);
      } catch (notifErr) {
        const notifError = notifErr as BusinessError;
        hilog.warn(DOMAIN, TAG, `清除通知失败（可能已不存在）: ${notifError.code} ${notifError.message}`);
        // 不影响主流程，继续执行
      }

      // 步骤4: 清除持久化存储中的 ID
      this.setCurrentLiveViewId(0);

      hilog.info(DOMAIN, TAG, `✅ 实况窗完全清理完成，ID: ${liveViewId}`);
      return true;
    } catch (err) {
      const error = err as BusinessError;
      hilog.error(DOMAIN, TAG, `❌ 结束实况窗失败: code=${error.code}, message=${error.message}`);
      return false;
    }
  }

  /**
   * 获取当前实况窗ID（已废弃，保留用于兼容）
   * @deprecated 使用 getCurrentLiveViewId() 替代
   */
  getCurrentLiveViewId_deprecated(): number {
    return this.getCurrentLiveViewId();
  }

  /**
   * 构建实况窗数据
   * @param options 实况窗选项
   */
  private async buildLiveViewData(options: LiveViewOptions): Promise<liveViewManager.LiveView> {
    const { title, progress, contentText, dayOfWeek } = options;

    // 构建内容文本数组
    const content = contentText ?
      [
        { text: contentText }
      ] :
      [
        { text: '已完成 ' },
        { text: `${progress}%`, textColor: '#FF0A59F7' },
        { text: ' 的计划目标' }
      ];

    // 将数字星期转换为中文（1-7 对应 周一到周日）
    const weekDays = ['一', '二', '三', '四', '五', '六', '日'];
    const dayText = dayOfWeek && dayOfWeek >= 1 && dayOfWeek <= 7
      ? `星期${weekDays[dayOfWeek - 1]}`
      : '计划完成度';

    return {
      id: this.generateLiveViewId(),
      event: 'WORKOUT', // 运动锻炼场景
      liveViewData: {
        primary: {
          title: title,
          content: content,
          keepTime: 3600, // 保留1小时
          clickAction: await this.buildWantAgent(),
          layoutData: {
            layoutType: liveViewManager.LayoutType.LAYOUT_TYPE_PROGRESS,
            progress: progress,
            color: '#FF0A59F7',
            backgroundColor: '#FFC9D7E4',
            lineType: liveViewManager.LineType.LINE_TYPE_NORMAL_SOLID_LINE,
            nodeIcons: ['node_icon_1.svg', 'node_icon_2.svg', 'node_icon_3.svg']  // 必需参数，不可删除
          }
        },
        // 文本胶囊配置（显示自定义文本）
        capsule: {
          type: liveViewManager.CapsuleType.CAPSULE_TYPE_TEXT,
          status: 1, // 显示胶囊
          icon: 'liveview_health_icon.svg', // 图标位于 /resources/rawfile/ 路径
          backgroundColor: '#FF0A59F7', // 蓝色背景
          title: dayText, // 左侧文本：显示星期几
          content: `完成度 ${progress}%` // 右侧文本：显示"完成度 XX%"
        }
      }
    };
  }

  /**
   * 构建 WantAgent（点击实况窗后的跳转行为）
   */
  private async buildWantAgent(): Promise<Object> {
    try {
      // 构建 Want 对象
      const want: Want = {
        bundleName: this.BUNDLE_NAME,
        abilityName: 'EntryAbility',
        parameters: {
          targetPage: 'pages/HealthPlanPage'
        }
      };

      hilog.info(DOMAIN, TAG, `准备创建WantAgent: ${JSON.stringify(want)}`);

      // 构建 WantAgentInfo
      const wantAgentInfo: wantAgent.WantAgentInfo = {
        wants: [want],
        actionType: wantAgent.OperationType.START_ABILITY,
        requestCode: 0
        // 移除 actionFlags，使用默认值
      };

      const agent = await wantAgent.getWantAgent(wantAgentInfo);
      hilog.info(DOMAIN, TAG, '✅ WantAgent创建成功');
      return agent;
    } catch (err) {
      const error = err as BusinessError;
      hilog.error(DOMAIN, TAG, `创建WantAgent失败: ${error.code} ${error.message}`);
      hilog.error(DOMAIN, TAG, `错误详细信息: ${JSON.stringify(err)}`);
      throw error;
    }
  }

  /**
   * 生成唯一的实况窗ID
   */
  private generateLiveViewId(): number {
    return Date.now();
  }
}

// 导出单例
export const liveViewService = new LiveViewService();
